#ifndef _MODBUS_POLL_H__
#define _MODBUS_POLL_H__

#include "modbus_user.h"

// Modbus 主机状态
typedef enum {
    MB_IDLE,              // 空闲状态
    MB_WAITING_RESPONSE,  // 等待响应
    MB_RESPONSE_RECEIVED, // 响应已接收
    MB_TIMEOUT            // 超时状态
} ModbusMasterState;

// 硬件抽象接口
typedef struct {
   void (*uart_send)( uint8_t *dat, uint16_t len);
   uint32_t (*get_timestamp_ms)(void); 
} ModbusMasterPort;

// Modbus 主机结构体
typedef struct {
    ModbusMasterPort port;        // 硬件接口
    ModbusMasterState state;      // 当前状态
    uint8_t last_slave_addr;      // 最后通信的从机地址
    uint32_t last_send_time;      // 最后发送时间
    uint32_t timeout_ms;          // 超时时间
    uint8_t rx_buffer[256];       // 接收缓冲区
    uint16_t rx_index;            // 接收索引
    uint16_t expected_length;     // 期望响应长度
    ModbusException last_error;   // 最后错误代码
} MasterConfig;

// 从机信息结构体
typedef struct 
{
    uint8_t id;              // 从机地址
    uint8_t func;            // 功能码
    uint16_t addr;           // 寄存器地址
    uint16_t len;            // 寄存器数量
    uint16_t *rec;           // 接收数据指针
}MasterUnit;

// 初始化 Modbus 主机
void ModbusMaterCreate(MasterConfig *master, 
                       ModbusMasterPort *port,
                       uint32_t timeout_ms);
// Modbus 主机轮询函数
ModbusException MasterPoll(MasterConfig *master, 
                           RingBuffer_t *rx_queue);

// 03功能码: 读保持寄存器
ModbusException MasterReadRegisters(MasterConfig *master,
                                    uint8_t slave_addr,
                                    uint16_t start_addr,
                                    uint16_t reg_count);
// 06功能码: 写单个寄存器
ModbusException MasterWriteRegister(MasterConfig *master,
                                    uint8_t slave_addr,
                                    uint16_t reg_addr,
                                    uint16_t value);
// 获取读取结果
ModbusException MasterGetReadResult(MasterConfig *master, 
                                    uint16_t *output, 
                                    uint16_t reg_count);
// 获取写入结果
ModbusException MasterGetWriteResult(MasterConfig *master); 
                                      
extern MasterConfig master;

#endif /* _MODBUS_POLL_H__ */
